package com.uc3m.dsic.gestorZoo;

import java.sql.*;
import java.util.ArrayList;
import java.util.Calendar;

/**
 * En la clase Zoo vienen dados los atributos: nombre, especie, edad,
 * descripcion, sala, pais , extincion, enfermedad
 *
 * @author Elena Canales Jimenez
 */
public class Animal {

    /**
     * Atributo1: nombre del animal.
     */
    private String nombre;
    /**
     * Atributo2: especie a la que pertenece el animal
     */
    private String especie;
    /**
     * Atributo3: edad del animal
     */
    private int edad;
    /**
     * Atributo4: descripcion del animal
     */
    private String descripcion;
    /**
     * Atributo5: sala donde se encuentra el animal.
     */
    private String sala;
    /**
     * Atributo6: pais de origen del animal.
     */
    private String pais;
    /**
     * Atributo7: si esta en extincion o no.
     */
    private String extincion;
    /**
     * Atributo8: enfermedad del animal.
     */
    private String enfermedad;

    /**
     * Constructor para crear un nuevo animal dados los atributos.
     * @param nombre	nombre del animal.
     * @param especie	especie del animal.
     * @param edad	edad del animal.
     * @param descripcion	descripcion del animal.
     * @param sala	sala en la que esta el animal.
     * @param pais	pais de origen del animal.
     * @param extincion esta en animal en extincion o no.
     * @param enfermedad si el animal padece alguna enfermedad o no.
     */
    public Animal(String nombreA, String especieA, int edadA,
            String descripcionA, String salaA, String paisA,
            String extincionA, String enfermedadA) throws ZooException, Exception {
        if (!nombreA.contains("'") && !especieA.contains("'")
                && !descripcionA.contains("'") && !salaA.contains("'")
                && !paisA.contains("'") && !extincionA.contains("'")
                && !enfermedadA.contains("'")) {
            if(edadA > 0){
                GestorSala gSala = new GestorSala();
                Sala s = gSala.getSalabyId(salaA);
                if (s != null) {
                    this.nombre = nombreA;
                    this.especie = especieA;
                    this.edad = edadA;
                    this.descripcion = descripcionA;
                    this.sala = salaA;
                    this.pais = paisA;
                    this.extincion = extincionA;
                    this.enfermedad = enfermedadA;
                } else {
                    throw new ZooException("No existe la sala asociada al animal.\n"
                            + "Por favor introduza la clave de una sala que exista");
                }
            }else{
                throw new ZooException("La edad debe ser positiva\n" +
                            "Por favor compruebe el valor introducido");
            }
        } else {
            throw new ZooException ("No se admite el caracter '. " +
                    "Por favor, modifiquelo");
        }
    } 

    /**
     * Constructor que crea un animal a partir de un resultado de la base
     * de datos
     *
     * @param fila
     *          Fila obtenida en la base de datos
     * @throws ZooException
     * @throws SQLException
     */
    public Animal (java.sql.ResultSet fila) throws ZooException, SQLException{

        if (fila == null){
            throw new ZooException ("La fila esta vacia. No se puede crear "
                    + "un Animal sin campos en la fila de entrada.");
        }
        if (fila.getMetaData().getColumnCount() != 8){
            throw new ZooException ("La fila no contiene los seis atributos" 
                    + " que caracterizan un Animal:nombre,especie,edad,"
                    + "descripcion,pais,extincion,enfermedad y sala."
                    + "\nMirar la tabla " +GestorZooAplicacion.FICHERO_BD
                    + " de la carpeta donde esta instalado esta aplicacion."
                    + "\nUna fila de la Tabla ANIMAL debe respetar ese formato.");
        }
        //hasta aqui ok. Se construye el animal con los ocho parametros de
        //la fila
        this.nombre = fila.getString(1);
        this.especie = fila.getString(2);
        this.edad = fila.getInt(3);
        this.descripcion = fila.getString(4);
        this.sala = fila.getString(8);
        this.pais = fila.getString(5);
        this.extincion = fila.getString(6);
        this.enfermedad = fila.getString(7);
    }

    /**
     * Metodo que muestra por consola los atributos del zoo.
     */
    public void mostrarZoo() {
        System.out.print("Nombre:" + nombre + "\tEdad: "
                + Integer.toString(edad) + "\tEspecie: " + especie
                + "\tDescripcion: " + descripcion + "\tSala: " + sala
                + "\tPais: " + pais + "\tExtincion :" + extincion
                + "\tEnfermedad: " + enfermedad + "\n");
    }

    /**
     * Metodo al que se llama para obtener el nombre del animal.
     * @return nombre Nombre del animal
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Metodo para asignar el nombre del animal.
     * @param nombre  Nombre animal
     */
    public void setNombre(String nombreA) {
        nombre = nombreA;
    }

    /**
     * Metodo al que se llama para obtener la edad del animal.
     *
     * @return edad Edad animal
     */
    public int getEdad() {
        return edad;
    }

    /**
     * Metodo para asignar la edad del animal.
     *
     * @param edad Edad animal
     */
    public void setEdad(int edadA) {
        edad = edadA;
    }

    /**
     * Metodo parar asignar/modificar la especie del animal.
     *
     * @param especie Especie animal
     */
    public void setEspecie(String especieA) {
        especie = especieA;
    }

    /**
     * Metodo para obtener la especie de un animal.
     *
     * @return especie Especie animal
     */
    public String getEspecie() {
        return especie;
    }

    /**
     * Para asignar la descripcion del animal.
     *
     * @param descripcion Descripcion animal
     */
    public void setDescripcion(String descripcionA) {
        descripcion = descripcionA;
    }

    /**
     * Para obtener la descripcion del animal.
     *
     * @return descripcion Descripcion animal
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * Metodo para asignar la sala donde esta el animal.
     *
     * @param sala Sala animal
     */
    public void setSala(String salaA) {
        sala = salaA;
    }

    /**
     * Metodo para obtener sala donde esta el animal.
     *
     * @return  Sala animal
     */
    public String getSala() {
        return sala;
    }

    /**
     * Metodo para asignar extincion del animal.
     *
     * @param extincion Extincion animal
     */
    public void setExtincion(String extincionA) {
        extincion = extincionA;
    }

    /**
     * Metodo para obtener extincion del animal.
     *
     * @return extincion Extincion animal
     */
    public String getExtincion() {
        return extincion;
    }

    /**
     * Metodo para asignar enfermedad al animal.
     *
     * @param enfermedad Enfermedad animal
     */
    public void setEnfermedad(String enfermedadA) {
        enfermedad = enfermedadA;
    }

    /**
     * Metodo para asignar enfermedad al animal.
     *
     * @param enfermedad Enfermedad animal
     */
    public void setPais(String paisA) {
        pais = paisA;
    }

    /**
     * Metodo para obtener enfermedad del animal.
     *
     * @return enfermedad Enfermedad animal
     */
    public String getEnfermedad() {
        return enfermedad;
    }

    @Override
    public String toString() {
        return "('" + this.nombre + "','" + this.especie + "','" + this.edad
                + "','" + this.descripcion + "','" + this.pais + "','"
                + this.extincion + "','" + this.enfermedad + "','" + this.sala
                + "')";
    }

    /**
     * Conversor de integer a string.
     *
     * @param parametro
     *          Numero a convertir en cadena de caracteres
     * @return El numero convertido en cadena de caracteres
     */
    public String toString(int parametro){
        String conversion = Integer.toString(parametro);
        return conversion;
    }

    /**
     * Inserta un nuevo Animal en la base de datos
     *
     * @throws Exception
     */
    public void insertarAnimal() throws Exception {
        GestorZooInterface izoo = new GestorZooAplicacion();
        String inserta = "INSERT INTO ANIMAL VALUES";
        String parametros[] = {nombre.trim().toUpperCase(),
                especie.trim().toUpperCase(),
                toString(edad).trim().toUpperCase(),
                descripcion.trim().toUpperCase(),
                pais.trim().toUpperCase(), extincion.trim().toUpperCase(),
                enfermedad.trim().toUpperCase(),sala.trim().toUpperCase()};
        izoo.actualiza(inserta, parametros);
        insertarCuida(izoo);
        izoo.cerrarBD();
    }

    /**
     * Borra un animal de la tabla a traves de su clave principal
     *
     * @throws Exception
     */
    public void borrarAnimal() throws Exception {
        GestorZooInterface izoo = new GestorZooAplicacion();
        izoo.actualiza("DELETE FROM ANIMAL WHERE Nombre ='" 
                + nombre.trim().toUpperCase() + "' AND Especie = '"
                + especie.trim().toUpperCase() + "'");
        borrarCuida(izoo);
        izoo.cerrarBD();
    }

    /**
     * Inserción de horarios en la base de datos
     *
     * @throws Exception
     */
    public void insertarCuida(GestorZooInterface izoo) throws Exception {
        String inserta = "INSERT INTO CUIDA VALUES";
        ArrayList<Cuidador> cuidadores;
        String dia;
        String cuidar;
        GestorCuidador gc = new GestorCuidador();
        int cuidador, aux;
        Calendar c = Calendar.getInstance();

        dia = c.get(Calendar.DATE) + "/" + c.get(Calendar.MONTH) + "/"
                + c.get(Calendar.YEAR);
        aux = gc.getNumCuidadoress(izoo);
        if(aux > 0){
            cuidador = (int)(Math.random() * (aux-1));
            cuidadores = gc.getCuidadorByEspecialidad("Cuidador");
            cuidar = cuidadores.get(cuidador).getId();

            String parametros[] = {nombre.trim().toUpperCase(),
                    especie.trim().toUpperCase(), cuidar.trim().toUpperCase(),
                    dia.trim().toUpperCase()};
            izoo.actualiza(inserta, parametros);
        }else{
            throw new ZooException("No se ha podido asignar un cuidador al an"
                    + "imal, dado que no hay ningún cuidador.");
        }
    }

    /**
     * Borrado de un horario de la base de datos a partir del identificador de
     * la fecha, el nombre del animal y la especie.
     *
     * @throws Exception
     */
    public void borrarCuida(GestorZooInterface izoo) throws Exception {
        izoo.actualiza("DELETE FROM CUIDA WHERE Nombre = '" 
                + nombre.trim().toUpperCase() + "' AND Especie = '"
                + especie.trim().toUpperCase() + "'");
    }
}

